package cn.vehicle.service.impl;

import cn.vehicle.domains.bo.QueryRoleBo;
import cn.vehicle.domains.entity.SysRoleEntity;
import cn.vehicle.exception.VehicleAccessException;
import cn.vehicle.mapper.SysRoleMapper;
import cn.vehicle.service.SysRoleService;
import jakarta.annotation.Resource;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 系统角色服务实现类
 * <p>
 * 负责系统角色的持久化操作，包括新增、修改、删除、查询及分页查询。
 * 通过 {@link SysRoleMapper} 与数据库交互，是角色管理模块的核心数据服务层。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>封装角色表（sys_role）的基础增删改查逻辑；</li>
 *   <li>捕获数据库异常并转换为业务异常 {@link VehicleAccessException}；</li>
 *   <li>为业务层（Biz 层）提供数据访问支持。</li>
 * </ul>
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {

    @Resource
    private SysRoleMapper sysRoleMapper;

    /**
     * 新增角色
     *
     * @param sysRoleEntity 角色实体对象
     * @throws VehicleAccessException 当角色已存在（唯一约束冲突）时抛出
     */
    @Override
    public void addRole(SysRoleEntity sysRoleEntity) {
        try {
            // 执行插入操作，将角色信息写入数据库
            sysRoleMapper.insertRole(sysRoleEntity);
        } catch (DuplicateKeyException e) {
            // 捕获数据库唯一约束异常并转化为业务异常
            throw VehicleAccessException.DATE_EXIST.newInstance("角色已存在");
        }
    }

    /**
     * 根据ID查询角色详情
     *
     * @param id 角色主键ID
     * @return 角色实体对象
     */
    @Override
    public SysRoleEntity getRoleById(Long id) {
        // 通过主键ID从数据库中查询角色信息
        return sysRoleMapper.selectRoleById(id);
    }

    /**
     * 更新角色信息
     *
     * @param updateEntity 更新的角色实体
     * @throws VehicleAccessException 若更新失败（未更新到记录）则抛出异常
     */
    @Override
    public void updateRole(SysRoleEntity updateEntity) {
        // 执行选择性更新操作，仅更新非空字段
        int i = sysRoleMapper.updateRoleSelective(updateEntity);
        // 若未更新到任何记录，说明角色不存在，抛出业务异常
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("更新角色未更新到数据");
        }
    }

    /**
     * 删除角色
     *
     * @param id 角色主键ID
     * @throws VehicleAccessException 若删除失败（记录不存在）则抛出异常
     */
    @Override
    public void deleteRole(Long id) {
        // 根据主键ID删除角色记录
        int i = sysRoleMapper.deleteRoleById(id);
        // 若删除数量不为1，说明角色不存在或已被删除
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("删除角色未删除到数据");
        }
    }

    /**
     * 查询角色列表
     *
     * @param queryRoleBo 查询条件封装对象
     * @return 角色实体列表
     */
    @Override
    public List<SysRoleEntity> selectRoleList(QueryRoleBo queryRoleBo) {
        // 执行条件查询，返回符合条件的角色集合
        return sysRoleMapper.selectRoleList(queryRoleBo);
    }
}
